python基础知识--pandas panel和multiindex使用技巧

写在前面

我们可以将panel理解成是多个DataFrame的层叠,每个DataFrame的名称对应为Panel的Minor_axis, 对于每一层的DataFrame而言, DataFrame的index为pandel的Major_aixs, DataFram的keys为panel的Items, 聚宽上读取的股票行情数据就是Panel格式的.

Panle使用技巧

从Minor_axis轴比较数据

例如:

p1 = pd.DataFrame({'stock1':[1,2,3,4], 'stock2':[2,3,4,5]}, index=['2010','2011','2012','2013'])
p2 = pd.DataFrame({'stock1':[2,3,4,5], 'stock2':[3,4,5,6]}, index=['2010','2011','2012','2013'])

>>>
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: item1 to item2
Major_axis axis: 2010 to 2013
Minor_axis axis: stock1 to stock2

我们想要得到两个dataframe的最大值,类似下面的结果, 其中每个值取的是最大值

      stock1  stock2
2010       2       3
2011       3       4
2012       4       5
2013       5       6

实现方法

func = lambda x: x[0] if x[0] >= x[1] else x[1]
re_df = pd.DataFrame()
# 提取minor_axis维数据, 比较完成之后重新构建一个dataframe
for i in pn.minor_axis:
    re_df[i] = pn.minor_xs(i).apply(func, axis=1)

输出结果

      stock1  stock2
2010       2       3
2011       3       4
2012       4       5
2013       5       6

multiindex

但是最近在使用pannel的时候,系统提示Panel结构在未来会被弃用, 建议使用DataFrame的MultiIndex代替,详细warning如下:

/opt/conda/lib/python3.6/site-packages/jqresearch/api.py:87: FutureWarning: 
Panel is deprecated and will be removed in a future version.
The recommended way to represent these types of 3-dimensional data are with a MultiIndex on a DataFrame, via the Panel.to_frame() method
Alternatively, you can use the xarray package http://xarray.pydata.org/en/stable/.
Pandas provides a `.to_xarray()` method to help automate this conversion.

pandasde multiindex比Panel更加直观, 易于展示.

multiindex创建比较简单, 只要将DataFrame中的某两列指定为index即可.

df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = df1.set_index(['课程','得分'])

>>> df1

课程  得分  分值
0   语文  最高  90
1   语文  最低  50
2   数学  最高  100
3   数学  最低  60

>>> df2
            分值
课程  得分  
语文  最高   90
     最低 50
数学  最高   100
     最低 60

同样还可以使用DataFrame.stack和unstack来操作mutiindex

DataFrame.reset_index(), 可以将multimindex转换成单个dataframe

两个index互换可以通过DataFrame.swaplevel

索引内部排序, DataFrame.sortlevel

合并两个multiindex

df1 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'属性':[9,5,10,6]})

df3 = df1.set_index(['课程','得分'])
df4 = df2.set_index(['课程','得分'])

df5 = pd.merge(df3, df4, left_index=True, right_index=True, how='inner')

输出:

           分值   属性
课程  得分      
语文  最高   90  9
     最低 50    5
数学  最高  100 10
     最低 60  6

参考文献

Pandas-4. Panel

用一个月整理的Pandas的教程!最全面的教程没有之一!先收藏吧!

Pandas面板(Panel)

在pandas多重索引multiIndex中选定指定索引的行

Pandas reshape相关函数介绍(pivot,pivot_table,stack,unstack,melt)

数分笔记整理15 - 数据处理综合运用 - 多层次索引MultiIndex

在MultiIndex中为缺少的日期插入0值

在Pandas MultiIndex中查找NaN值

在pandas中循环使用MultiIndex